/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package co.dzgroup.votacion.interfaz;

import co.dzgroup.votacion.modelo.Administrador;
import co.dzgroup.votacion.modelo.Barrio;
import co.dzgroup.votacion.modelo.Candidato;
import co.dzgroup.votacion.modelo.Comuna;
import co.dzgroup.votacion.modelo.Departamento;
import co.dzgroup.votacion.modelo.Eleccion;
import co.dzgroup.votacion.modelo.Municipio;
import co.dzgroup.votacion.modelo.PartidoPolitico;
import co.dzgroup.votacion.modelo.Persona;
import co.dzgroup.votacion.modelo.TipoEleccion;
import co.dzgroup.votacion.modelo.Votante;
import co.dzgroup.votacion.modelo.Voto;
import java.sql.SQLException;
import java.util.List;

/**
 * Interfaz para definir los métodos basicos de paramettrización
 * de la información
 * @author Lucho
 */
public interface IParametrizacion {

    /**
     * Método para guardar la información del partido político
     * @param partidoPolitico
     * @return TRUE si se guardó la información correctamente, de lo contrario devuelve FALSE
     * @throws SQLException
     */
    public boolean guardarPartidoPolitico(PartidoPolitico partidoPolitico)throws SQLException;

    /**
     * Método para guardar la información de la elección.
     * @param eleccion
     * @return TRUE si guardo la información correctamente, de lo contrario devuelve FALSE.
     * @throws SQLException
     */
    public Eleccion guardarEleccion(Eleccion eleccion)throws SQLException;

    /**
     * Método para consultar los tipos de elección
     * @return List<TipoEleccion>
     * @throws SQLException
     */
    public List<TipoEleccion> consultarTiposEleccion()throws SQLException;

    /**
     * Método para consultar la lista de departamentos
     * @return
     * @throws SQLException
     */
    public List<Departamento> consultarDepartamento()throws SQLException;

    /**
     * Método que consulta el tipo de candidato
     * @return
     * @throws SQLException
     */
    public Candidato seleccionarCandidato() throws SQLException;


    /**
     * Metodo que consulta los candidatos asociados al tipo de eleccion
     * @param eleccion_id
     * @return
     * @throws SQLException
     */
    public List<Candidato> seleccionarCandidatosPorTipoEleccion(Integer eleccion_id)throws SQLException;

    /**
     * Metodo que guarda el voto de los candidatos
     * @param voto
     * @return
     */
    public boolean guardarVoto(Voto voto)throws SQLException;

    /**
     * Metodo que consulta los partidos politicos de la aplicacion
     * @return
     * @throws SQLException
     */
    public List<PartidoPolitico> consultarPartidosPoliticos() throws SQLException;

    /**
     * Metodo que guarda los candidatos 
     * @param candidato
     * @return
     * @throws SQLException
     */
    public boolean guardarCandidato(Candidato candidato) throws SQLException;

    /**
     * MÃ©todo para listar municipios
     * @return List<Municipion>
     * @throws SQLException
     */
    public List<Municipio> consultarMunicipio()throws SQLException;

    /**
     * MÃ©todo para listar comunas
     * @return List<Comuna>
     * @throws SQLException
     */
    public List<Comuna> consultarComuna()throws SQLException;

    /**
     * MÃ©todo para listar barrios
     * @return List<Barrio>
     * @throws SQLException
     */
    public List<Barrio> consultarBarrio()throws SQLException;

    /**
     * MÃ©todo para guardar la informaciÃ³n del votante
     * @param votante
     * @return TRUE si se guardÃ³ la informaciÃ³n correctamente, de lo contrario devuelve FALSE
     * @throws SQLException
     */
    public boolean guardarPersona(Persona persona)throws SQLException;
    /**
     * MÃ©todo para guardar la informaciÃ³n de la persona
     * @param persona
     * @return TRUE si se guardÃ³ la informaciÃ³n correctamente, de lo contrario devuelve FALSE
     * @throws SQLException
     */
    public boolean guardarVotante(Votante votante)throws SQLException;
    /**
     * MÃ©todo para generar codigo de logueo
     * @param longitud
     * @return codigo de logueo
     */
    public String getCadenaAlfanumAleatoria (int longitud);

     /**
     * Metodo que consulta las elecciones actuales activas
     * @return
     * @throws SQLException
     */
    public List<Eleccion> consultarEleccionActual()throws SQLException;

    /**
     * Método para consultar el votante por el documento de identidad
     * @param documento
     * @return Null si el votante por ese documento no se encuentra, de lo
     * contrario devuelve el objeto con Votante con todos sus atributos.
     */
    public Votante consultarVotantePorDocumento(String documento)throws SQLException;

    /**
     * Método para actualizar el código de logueo de la persona
     * @param personaId
     * @param clave
     * @return TRUE si se actualizó correctamente el código de logueo de la persona,
     * de lo contrario devuelve FALSE.
     */
    public boolean actualizarCodigoLogueoPersona(Integer personaId,String clave)throws SQLException;

    /**
     * Metodo que consulta los candidatos de una eleccion especifica
     * @param bd
     * @param usuario
     * @param psw
     * @autor carlos valencia
     * @return
     */
    public Votante consultarVotante(String usuario,String psw);

    /**
     * Metodo que consulta el admininistrador asociado al psw y el usuario
     * @param bd
     * @param usuario
     * @param psw
     * @autor carlos Valencia
     * @return
     */
    public Administrador consultarAdministrador(String usuario,String psw);

    /**
     * Método para consultar los candidatos por tipos de elección
     * @param bd
     * @param tiposEleccion
     * @return List<Candidato>
     */
    public List<Candidato> consultarCandidatosEleccion(String tiposEleccion)throws SQLException;

    /**
     * Método para guardar los candidatos del tipo de elección
     * @param eleccion
     * @return TRUE si guardo los registros correctamente, de los contrario devuelve FALSE.
     * @throws SQLException
     */
    public boolean guardarEleccionCandidato(Eleccion eleccion)throws SQLException;

    /**
     * 
     * @return
     * @throws SQLException
     */
    public List<Eleccion> consultarElecciones()throws SQLException;

    /**
     *
     * @param candidato_id
     * @param eleccion_id
     * @return Número de votos
     */
    public Integer consultarVotosEleccionCandidato(Integer candidato_id,Integer eleccion_id);

    /**
     * 
     * @param rango
     * @return
     */
    public List<Votante> consultarVotantesRangoFechas(Integer rango);

    /**
     * Metodo que consulta si el votante ya realizo un voto anteriormente
     * @param votante_id
     * @param eleccion_id
     * @return
     */
    public boolean consultarVotoVotanteEleccion(Integer votante_id,Integer eleccion_id);

    /**
     * Metodo que retorna la cantidad de votos en blanco de una eleccion y un tipo de eleccion
     * @param bd
     * @param candidato_id
     * @param eleccion_id
     * @return
     */
    public Integer consultarVotosBlancoEleccionTipoEleccion(Integer tipo_eleccion_id,Integer eleccion_id);

    /**
     * Metodo que retorna la cantidad de votos en blanco de una eleccion y un tipo de eleccion
     * @param bd
     * @param candidato_id
     * @param eleccion_id
     * @return
     */
    public Integer consultarVotosNulosEleccionTipoEleccion(Integer tipo_eleccion_id,Integer eleccion_id);

    /**
     * Metodo que consulta el votante asociado al psw y contraseña
     * @param bd
     * @param usuario
     * @param psw
     * @autor carlos valencia
     * @return
     */
    public Votante consultarVotantePorPersonaId(Integer personaId);
}
